package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Future;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import java.time.LocalDateTime;

/**
 * 赛程表实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("schedule")
public class Schedule {
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 项目ID
     */
    @NotNull(message = "项目ID不能为空")
    private Long projectId;

    /**
     * 场地ID
     */
    @NotNull(message = "场地ID不能为空")
    private Integer venueId;

    /**
     * 轮次
     */
    @Min(value = 1, message = "轮次至少为1")
    @Max(value = 10, message = "轮次不能超过10")
    private Integer round;

    /**
     * 开始时间
     */
    @NotNull(message = "开始时间不能为空")
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    @NotNull(message = "结束时间不能为空")
    private LocalDateTime endTime;

    /**
     * 状态：未开始、进行中、已结束、延期、取消
     */
    private String status;

    /**
     * 主裁判ID
     */
    private Long refereeId;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 项目对象（关联查询时使用）
     */
    @TableField(exist = false)
    private Project project;

    /**
     * 场地对象（关联查询时使用）
     */
    @TableField(exist = false)
    private Venue venue;

    /**
     * 裁判对象（关联查询时使用）
     */
    @TableField(exist = false)
    private User referee;

    /**
     * 赛程状态枚举
     */
    public enum ScheduleStatus {
        NOT_STARTED("未开始"),
        IN_PROGRESS("进行中"),
        COMPLETED("已结束"),
        POSTPONED("延期"),
        CANCELLED("取消");

        private final String displayName;

        ScheduleStatus(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        /**
         * 根据显示名称获取枚举值
         */
        public static ScheduleStatus fromDisplayName(String displayName) {
            for (ScheduleStatus status : ScheduleStatus.values()) {
                if (status.getDisplayName().equals(displayName)) {
                    return status;
                }
            }
            return null;
        }
    }

    /**
     * 设置赛程状态
     */
    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * 获取赛程状态显示名称
     */
    public String getStatusDisplayName() {
        ScheduleStatus statusEnum = ScheduleStatus.fromDisplayName(this.status);
        return statusEnum != null ? statusEnum.getDisplayName() : this.status;
    }

    /**
     * 检查是否可以开始比赛
     */
    public boolean canStart() {
        return "未开始".equals(this.status);
    }

    /**
     * 检查是否可以结束比赛
     */
    public boolean canEnd() {
        return "进行中".equals(this.status);
    }

    /**
     * 检查是否可以延期
     */
    public boolean canPostpone() {
        return "未开始".equals(this.status) || "进行中".equals(this.status);
    }

    /**
     * 检查是否可以取消
     */
    public boolean canCancel() {
        return !"已结束".equals(this.status) && !"取消".equals(this.status);
    }

    /**
     * 检查是否已结束
     */
    public boolean isCompleted() {
        return "已结束".equals(this.status);
    }

    /**
     * 检查是否已取消
     */
    public boolean isCancelled() {
        return "取消".equals(this.status);
    }

    /**
     * 检查是否进行中
     */
    public boolean isInProgress() {
        return "进行中".equals(this.status);
    }

    /**
     * 获取比赛持续时间（分钟）
     */
    public long getDurationMinutes() {
        if (startTime == null || endTime == null) {
            return 0;
        }
        return java.time.Duration.between(startTime, endTime).toMinutes();
    }

    /**
     * 检查时间是否冲突
     */
    public boolean hasTimeConflict(LocalDateTime otherStart, LocalDateTime otherEnd) {
        if (this.startTime == null || this.endTime == null || otherStart == null || otherEnd == null) {
            return false;
        }
        return this.startTime.isBefore(otherEnd) && this.endTime.isAfter(otherStart);
    }

    /**
     * 检查场地是否相同
     */
    public boolean hasSameVenue(Integer otherVenueId) {
        return this.venueId != null && this.venueId.equals(otherVenueId);
    }
}